package main

import "fmt"

// 泛型
// go 1.8 以后支持泛型。go语言为静态类型语言，有时候为了适配多种类型参数，而需要写出多种功能相同传入参数不同的方法(多态)。为了解决这个重复写的问题，于是推出了泛型
// 内置的泛型
// any go里面所有内置的基本类型 等价于 interface{}
// comparable go里面内置的所有可比较类型 int uint float bool struct 指针等

// 泛型类型
func demo1() {
	// 切片类型
	type MySlice[T int | float32 | float64] []T
	var myA MySlice[int]
	myA1 := []int{1, 2, 3, 4}
	myA = myA1
	fmt.Println(myA)
	var myB MySlice[float32] = []float32{1.2, 3.2, 4.2}
	fmt.Println(myB)
	// map类型
	type MyMap[KEY string | int | float32, VALUE string | int | float32] map[KEY]VALUE
	var m1 MyMap[string, int] = map[string]int{
		"age":    2,
		"python": 3,
	}
	fmt.Println(m1)
}

// 泛型方法
type MySlice2[T int | float32] []T

func (m MySlice2[T]) demo2() T {
	var sum T
	for _, v := range m {
		sum += v
	}
	return sum

}

// 泛型函数
func demo3[T int | float32 | string](a T, b T) T {
	return a + b
}

func main() {
	// demo1()
	var m2 MySlice2[float32] = []float32{1.3, 3.24}
	fmt.Println(m2.demo2())

	fmt.Println(demo3[string]("sba", "hello"))
}
